package persistencia.xml;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import compartido.IEntidad;

import persistencia.IGondola;

public class GondolaXML implements IGondola {
	protected File archivo;
	protected boolean sucia;
	protected Map<String,IEntidad> instancias; 
	
	@SuppressWarnings("unchecked")
	public GondolaXML(String nombre) {
		archivo = new File(nombre);
		sucia = false;
		if (!archivo.exists())
			instancias = new HashMap<String, IEntidad>();
		else {
			BufferedInputStream stream;
			try {
				stream = new BufferedInputStream(new FileInputStream(archivo));
				XMLDecoder decoder = new XMLDecoder(stream);
				Object leido = decoder.readObject();
				if (leido instanceof Map<?,?>) {
					instancias = (Map<String, IEntidad>) leido;
				}
			} catch (FileNotFoundException e) {
			}
		}
	}
	
	@Override
	public boolean agregar(IEntidad nueva) {
		String clave = nueva.getIdentificador();
		boolean existe = instancias.keySet().contains(clave);
		if (!existe) {
			instancias.put(clave, nueva);
			sucia = true;
		}
		return (!existe);
	}

	@Override
	public boolean eliminar(IEntidad existente) {
		IEntidad eliminada = instancias.remove(existente.getIdentificador());
		sucia|= (eliminada != null);
		return (eliminada != null);
	}

	@Override
	public boolean estaSucia() {
		return sucia;
	}

	@Override
	public Iterator<IEntidad> getIterator() {
		return instancias.values().iterator();
	}

	@Override
	public String getNombre() {
		return archivo.getAbsolutePath();
	}

	@Override
	public boolean modificar(IEntidad modificada) {
		String clave = modificada.getIdentificador();
		boolean existe = instancias.keySet().contains(clave);
		if (existe) {
			instancias.put(clave, modificada);
			sucia = true;
		}
		return (existe);
	}

	@Override
	public IEntidad obtener(String identificador) {
		IEntidad buscada = instancias.get(identificador);
		return buscada;
	}

	@Override
	public Iterator<IEntidad> iterator() {
		return getIterator();
	}

	@Override
	public void guardar() {
		BufferedOutputStream stream;
		try {
			stream = new BufferedOutputStream(new FileOutputStream(archivo));
			XMLEncoder encoder = CodificadorXML.getInstancia().armarCodificador(stream);
			encoder.writeObject(instancias);
			encoder.close();
		} catch (FileNotFoundException e) {
		}
	}

}
